perm filename SCANER.SAI[SYS,HE]3 blob sn#014945 filedate 1972-11-30 generic text, type T, neo UTF8
00100	COMMENT ⊗   VALID 00010 PAGES 
00200	RECORD PAGE   DESCRIPTION
00300	 00001 00001
00400	 00003 00002	ENTRY XTENT
00500	 00006 00003	⊃	CHANGE CLIP LEVEL MAX. DIFF. AND SET CLIPS TO IT
00600	 00009 00004	⊃	DEBUGGING ROUTINES
00700	 00011 00005	⊃	INITIALIZES SENSITIVITY CONTROL
00800	 00015 00006	⊃	SET CLIP LEVELS TO JUST INCLUDE THE RANGE
00900	 00017 00007	⊃	GENERAL ACCOMODATION ROUTINE
01000	 00021 00008	⊃	ENTRY TO KEEP RASTER INTERSECTION IN BOUNDS
01100	 00024 00009	⊃  VERIFIES  THAT  DETECTED  DISCONTINUITY  BELONGS TO AN OBJECT EDGE OF
01200	 00028 00010	⊃ 	TEST WHETHER I2 (NEXT SCAN POINT) DIFFERS
01300	 00030 ENDMK
01400	⊗;
     

00100	ENTRY XTENT;
00200	BEGIN "SCNER"
00300	REQUIRE "PREAMB.SAI[SYS,HE]" SOURCE_FILE;
00400	REQUIRE "DPYSUB.HDR[SYS,HE]" SOURCE_FILE;
00500	REQUIRE 500 STRING_SPACE;
00600	
00700	EXTERNAL INTEGER PROCEDURE GETPNT(INTEGER X,Y);
00800	EXTERNAL PROCEDURE INTPNT;
00900	EXTERNAL PROCEDURE TVIN;
01000	EXTERNAL INTEGER PROCEDURE GENTER(INTEGER X,Y; REFERENCE BOOLEAN O;
01100		REFERENCE INTEGER D);
01200	EXTERNAL INTEGER PROCEDURE DDACO(INTEGER DAC);
01300	EXTERNAL INTEGER PROCEDURE YOPER(INTEGER X,Y; REFERENCE INTEGER ANG;
01400		INTEGER CW; BOOLEAN TRAC,FLAG);
01500	
01600	DEFINE CRLF="'15&'12",⊃="COMMENT", TVRESET="STVFL←0", SAFEX="SAFE",
01700		TVX(X)="(X)*3.0-512.0", TVY(Y)="512.0-(Y)*3.0";
01800	EXTERNAL INTEGER GTHRES, JOBNUM;
01900	EXTERNAL BOOLEAN ACCOMINIT;	⊃	 RESETS STATISTICS FOR NEW SCENE;
02000	EXTERNAL INTEGER BCLIP, TCLIP, FLINE, LLINE, RSIDE, LSIDE, IND, TMAX, BMAX,
02100		LSMAX, RSMAX, STVFL, IWID, TVCAM;
02200	EXTERNAL REAL OD, OB;
02300	INTEGER INT,INT2,KKP,FRAMEX,CLIPDIF,I1, I2, CW, TRAC, X2, Y2, DIR;
02400	INTERNAL BOOLEAN SCAN_ACC, SCAN_DIR;
02500	BOOLEAN ADEB, DISSHW;
02600	SAFEX INTEGER ARRAY DISPL[1:100];
02700	SAFEX BOOLEAN ARRAY TDAC[0:63];
02800	PRELOAD_WITH 0, [3] 1, 0, [3] -1;
02900	SAFEX INTEGER ARRAY SDIRX[0:7];
03000	PRELOAD_WITH 1, 1, 0, [3] -1, 0, 1;
03100	SAFEX INTEGER ARRAY SDIRY[0:7];
03200	
03300	SIMPLE PROCEDURE OUTCLIP(STRING LAB);
03400		IF TYP_EDGE THEN
03500			OUTSTR(LAB&" TCLIP="&CVS(TCLIP)&"  BCLIP="&CVS(BCLIP)&CRLF);
03600	
03700	⊃	CHECK CLIP LEVEL AND ADJUST IF CHANGED;
03800		
03900	SIMPLE INTERNAL PROCEDURE REINIT;
04000		IF ABS(TCLIP-BCLIP)<CLIPDIF THEN
04100			BEGIN
04200			TCLIP←(7-CLIPDIF) DIV 2;
04300			BCLIP←TCLIP+CLIPDIF;
04400			TVRESET;
04500			OUTCLIP("REINIT");
04600			END;
     

00100	⊃	CHANGE CLIP LEVEL MAX. DIFF. AND SET CLIPS TO IT;
00200	
00300	SIMPLE INTERNAL PROCEDURE CLIPCHG(INTEGER DIF);
00400		IF 0≤DIF≤7 THEN
00500			BEGIN
00600			CLIPDIF ← DIF;
00700			REINIT;
00800			END;
00900	
01000	SIMPLE INTEGER PROCEDURE DACO(INTEGER D);
01100		IF 0<D≤62 THEN
01200			BEGIN INTEGER I;
01300			I ← DDACO(D);
01400			TDAC[D] ← FALSE;
01500			TVRESET;
01600			IF TYP_EDGE THEN
01700				OUTSTR("DAC SET AT "&CVS(D)&"   AD="&CVS(I)&CRLF);
01800			RETURN(I);
01900			END;
02000	
02100	
02200	⊃		VARIABLES USED FOR SENSITIVITY CONTROL
02300	
02400	AUTO_ACC	SETTING OF DAC AT AUTOTARGET LIMIT
02500	AUTOCAL_ACC	TABLE_ACC INITIALIZED
02600	DAC_ACC		CURRENT DAC SETTING
02700	SENSCAL_ACC	SENSITIVITY HAS BEEN CALIBRATED
02800	SENSIGN_ACC	LAST CHANGE   1 UP, -1 DOWN [NOT USED]
02900	SENSFLAG_ACC	SENSITIVITY CAN BE RAISED [NOT USED]
03000	SENDWNFG_ACC	SENSITIVITY CANNOT BE LOWERED [NOT USED]
03100	SCAN_ACC	FALSE IF ACCOMODATION DESIRED ON INITIAL SCAN [NOT USED]
03200	SCAN_DIR	DIRECTION SENSITIVITY IS ALLOWED TO CHANGE
03300			-1 DOWN, 1 UP, 0 EITHER
03400	CHANGE_ACC	TRUE IF SCENE HAS CHANGED
03500	ACCOMINIT	TRUE IF EDGE FOLLOWER SHOULD INIT SCANNER
03600	TABLE_ACC	HOLDS AD READINGS FOR DAC SETTINGS READ, -1 FOR OTHERS
03700	;
03800	
03900	SIMPLE INTERNAL PROCEDURE ACCOON;
04000		BEGIN INTEGER I;
04100		IF DISDEV≠2 THEN OUTSTR("NO DEBUGGING ON THIS DEVICE"&CRLF) ELSE
04200		IF (FRAMEX←GETPOG)≥0 THEN DISSHW←ADEB←TRUE ELSE
04300			OUTSTR("NO FREE FRAMES - ACCOON"&CRLF);
04400		END;
04500	
04600	SIMPLE INTERNAL PROCEDURE ACCOFF;
04700		BEGIN
04800		ADEB ← FALSE;
04900		RELPOG(FRAMEX);
05000		END;
     

00100	⊃	DEBUGGING ROUTINES;
00200	
00300	SIMPLE PROCEDURE SHOW(STRING FOO; INTEGER X1,Y1,X2,Y2);
00400		BEGIN INTEGER I, CNT, DISSAVE;
00500		DISSAVE ← DPYPARS;
00600		DPYSET(DISPL);
00700		DPYBRT(3);
00800		DPYBIG(3);
00900		SETFORMAT(3,0);
01000		AIVECT(-512,400);
01100		DPYSST(FOO&CRLF&"TCLIP="&CVS(TCLIP)&CRLF&"BCLIP="&CVS(BCLIP)&CRLF&
01200			"DAC="&CVS(DAC_ACC)&CRLF&"INT1="&CVS(I1)&CRLF&"INT2="&
01300			CVS(I2)&CRLF&"IWID="&CVS(IWID));
01400		DPYSST(CRLF&"AUTO_ACC ="&CVS(AUTO_ACC)&CRLF);
01500		DPYSST("CHANGE= "&(IF CHANGE_ACC THEN "TRUE" ELSE "FALSE"));
01600		DPYSST(CRLF&"SENS IS "&(IF ¬SENSFLAG_ACC THEN "UP" ELSE
01700			IF SENDWNFG_ACC THEN "DOWN" ELSE ""));
01800		APT(TVX(X1),TVY(Y1));
01900		APT(TVX(X2),TVY(Y2));
02000		DPYOUT(FRAMEX);
02100		DPYRESET(DISSAVE);
02200		IF CNT≤0 THEN
02300			BEGIN
02400			IF "0"≤(I←INCHRW)≤"9" THEN CNT←CNT+I-"0"
02500			END ELSE CNT←CNT-1;
02600		IF I="Y" THEN DISSHW ← TRUE;
02700		IF I="N" THEN DISSHW ← FALSE;
02800		END;
     

00100	⊃	INITIALIZES SENSITIVITY CONTROL;
00200	
00300	SIMPLE PROCEDURE SENSINIT;
00400		BEGIN LABEL HALF, LOUT, L2;
00500		INTEGER UDAC, LDAC, I, J, K, TST, PT, CURAD;
00600		IF ¬AUTOCAL_ACC THEN
00700	L2:		BEGIN "INIT"
00800			FOR I←2 STEP 1 UNTIL 61 DO TABLE_ACC[I] ← -1;
00900			AUTO_ACC ← 60;
01000			TABLE_ACC[LDAC←62] ← DACO(LDAC);
01100			TABLE_ACC[UDAC←1] ← DACO(UDAC);
01200			IF ABS(TABLE_ACC[62]-TABLE_ACC[1])<100 THEN
01300				BEGIN
01400				OUTSTR("SENSITIVITY CONTROL IS HUNG"&CRLF&
01500					"TYPE ANY CHAR TO CONT."&CRLF);
01600				INCHWL;
01700				GO TO L2;
01800				END;
01900			AUTOCAL_ACC ← TRUE;
02000			GO TO HALF;
02100			END "INIT";
02200		TABLE_ACC[1] ← CURAD ← DACO(1);
02300		IF ABS(CURAD-(J←TABLE_ACC[AUTO_ACC]))<40 THEN GO TO LOUT;
02400		IF CURAD<J THEN
02500			BEGIN "HI"
02600			UDAC ← 1;
02700			LDAC ← AUTO_ACC;
02800			AUTO_ACC ← AUTO_ACC-1;
02900			GO TO HALF;
03000			END "HI";
03100		TST ← 10000;
03200		FOR I←62 STEP -1 UNTIL AUTO_ACC DO
03300			IF (J←TABLE_ACC[I])≥0∧(K←ABS(CURAD-J))<TST THEN
03400			BEGIN 
03500			IF K<20 THEN BEGIN AUTO_ACC ← I; GO TO LOUT; END;
03600			TST ← K; PT ← I;
03700			END;
03800		J ← IF K←(TABLE_ACC[PT]>CURAD) THEN -1 ELSE 0;
03900		TST ← PT;
04000		WHILE TABLE_ACC[TST←TST+J]<0 DO;
04100		IF K THEN BEGIN LDAC←PT; UDAC←TST; END ELSE
04200			BEGIN LDAC←TST; UDAC←PT; END;
04300		IF LDAC-UDAC<2 THEN
04400	LOUT:		BEGIN "OUT"
04500			SENSCAL_ACC ← TRUE;
04600			CHANGE_ACC ← FALSE;
04700			IF AUTO_ACC≠DAC_ACC THEN DACO(AUTO_ACC);
04800			OUTSTR("AUTO TARGET SET AT  "&CVS(AUTO_ACC)&CRLF);
04900			RETURN;
05000			END "OUT";
05100	HALF:	I ← (LDAC+UDAC) DIV 2;
05200		CURAD ← TABLE_ACC[I] ← DACO(I);
05300		IF ABS(CURAD-TABLE_ACC[UDAC])<50 THEN
05400			BEGIN "L1"
05500			UDAC ← I;
05600			IF LDAC-UDAC<2 THEN
05700				BEGIN
05800				IF CURAD-TABLE_ACC[I-1]>50 THEN DACO(AUTO_ACC←I-1)
05900					ELSE AUTO_ACC←I;
06000				GO TO LOUT;
06100				END;
06200			GO TO HALF;
06300			END "L1";
06400		LDAC ← I;
06500		AUTO_ACC ← LDAC-1;
06600		IF LDAC-UDAC<2 THEN GO TO LOUT;
06700		GO TO HALF;
06800		END;
     

00100	⊃	SET CLIP LEVELS TO JUST INCLUDE THE RANGE
00200			OF INTENSITIES GIVEN;
00300	
00400	SIMPLE BOOLEAN PROCEDURE CLIPSET(REFERENCE INTEGER INT, INT2);
00500		BEGIN INTEGER BIG, T, B;
00600		T←TCLIP+(BCLIP-TCLIP)*(15-(INT MAX INT2))%14;
00700		B←BCLIP-(BCLIP-TCLIP)*(INT MIN INT2)%14;
00800		IF T>B THEN
00900			BEGIN
01000			OUTSTR("CLIP LEVELS REVERSED - CLIPRANGE"&CRLF);
01100			TCLIP↔BCLIP;
01200			END;
01300		IF TCLIP=T∧BCLIP=B THEN RETURN(TRUE);
01400		TCLIP←T;BCLIP←B;TVRESET;
01500		RETURN(FALSE);
01600		END;
01700	
01800	⊃	TEST FOR RASTER SCAN FOR ACOMTEST.
01900		X2, Y2 MUST BE SET BEFORE CALLING;
02000	
02100	SIMPLE BOOLEAN PROCEDURE TEST1(REFERENCE INTEGER X,Y);
02200		BEGIN INTEGER I, J;
02300		I1 ← GENTER(X, Y, J←-1,I);
02400		I2 ← GENTER(X2, Y2, J←-1,I);
02500		RETURN(ABS(I1-I2)≥GTHRES∨((I1 MIN I2)>0∧(I1 MAX I2)<15));
02600		END;
02700	
02800	⊃	TEST FOR EDGE TRACING. TRAC, CW MUST BE SET BEFORE CALLING;
02900	
03000	SIMPLE BOOLEAN PROCEDURE TEST2(REFERENCE INTEGER X,Y);
03100		BEGIN
03200		INTEGER I,COH;
03300		COH ← YOPER(X, Y, DIR, CW, TRAC, I←0);
03400		I1 ← OD+.5;
03500		I2 ← OB+.5;
03600		RETURN(COH≥2);
03700		END;
03800	
03900	⊃	TEST FOR RASTER SCAN FOR FINEAC.  X2, Y2 MUST BE SET BEFORE CALLING;
04000	
04100	SIMPLE BOOLEAN PROCEDURE TEST3(REFERENCE INTEGER X,Y);
04200		BEGIN INTEGER I, J;
04300		I1 ← GENTER(X, Y, J←-1, I);
04400		I2 ← GENTER(X2, Y2, J←-1, I);
04500		RETURN(ABS(I1-I2)≥GTHRES);
04600		END;
     

00100	⊃	GENERAL ACCOMODATION ROUTINE;
00200	
00300	BOOLEAN PROCEDURE ACC(BOOLEAN CC;INTEGER MDAC, X, Y;BOOLEAN PROCEDURE TST);
00400		BEGIN
00500		INTEGER I, J, MX, MN, AD, K, BS, TS;
00600		LABEL L1, A, B, C;
00700	
00800	⊃	QUICK TEST FOR AUTOTARGET LIMIT;
00900	
01000		IF (¬I1∨¬I2)∧BCLIP=7∧AUTO_ACC=DAC_ACC∧¬CHANGE_ACC∧
01100			(BCLIP-TCLIP)≤CLIPDIF THEN RETURN(FALSE);
01200	
01300		⊃	INIT LEGAL DAC TABLE;
01400	
01500		TDAC[63] ← FALSE;
01600		TDAC[AUTO_ACC-1] ← FALSE;
01700		TDAC[AUTO_ACC] ← TRUE;
01800		ARRBLT(TDAC[AUTO_ACC+1],TDAC[AUTO_ACC],62-AUTO_ACC);
01900		BS ← BCLIP;
02000		TS ← TCLIP;
02100		IF BCLIP<7∨TCLIP THEN
02200			BEGIN
02300			BCLIP ← 7;
02400			TCLIP ← 0;
02500			TVRESET;
02600			END;
02700	
02800		⊃	ADJUST DAC AS NECESSARY AND POSSIBLE;
02900	
03000	L1:	IF TST(X,Y) THEN GO TO B;
03100		MN ← I1 MIN I2;
03200		MX ← I1 MAX I2;
03300		IF MX>15 THEN
03400			BEGIN
03500			OUTSTR("INT TOO LARGE"&CRLF);
03600			MX←15;
03700			IF I1>15 THEN I1←15 ELSE I2←15;
03800			END;
03900		IF MN<0 THEN
04000			BEGIN
04100			OUTSTR("INT TOO SMALL"&CRLF);
04200			MX←0;
04300			IF I1<0 THEN I1←0 ELSE I2←0;
04400			END;
04500		IF (¬MN∧MX=15)∨(MN>0∧MX<15)∨(MX-MN)>GTHRES∨TVCAM≠1 THEN GO TO A;
04600		IF MN THEN
04700			BEGIN "MN"
04800			FOR I←1 STEP 1 UNTIL MDAC+1 DO
04900				IF ¬TDAC[DAC_ACC+I] THEN DONE;
05000			I ← I-1;
05100			IF ¬I THEN GO TO A;
05200			J ← DAC_ACC;
05300			TABLE_ACC[DAC_ACC+I] ← DACO(DAC_ACC+I);
05400			IF ADEB THEN SHOW("DOWN",X,Y,X2,Y2);
05500			GO TO L1;
05600			END "MN";
05700		AD ← 0;
05800		FOR I←1 STEP 1 UNTIL MDAC+1 DO IF ¬TDAC[DAC_ACC-I] THEN DONE;
05900		I ← I-1;
06000		IF ¬I THEN
06100			BEGIN
06200			IF (DAC_ACC-1>AUTO_ACC)∨¬CHANGE_ACC THEN GO TO A;
06300			I ← MDAC ← 1;
06400			TABLE_ACC[DAC_ACC] ← AD ← DDACO(-1);
06500			END;
06600		J ← DAC_ACC;
06700		I ← TABLE_ACC[DAC_ACC-I] ← DACO(DAC_ACC-I);
06800		IF ADEB THEN SHOW("UP",X,Y,X2,Y2);
06900		IF AD THEN
07000			BEGIN "AD"
07100			IF ABS(AD-I)<10 THEN
07200				BEGIN
07300				DAC_ACC ← J;
07400				CHANGE_ACC ← FALSE;
07500				GO TO A;
07600				END;
07700			TDAC[AUTO_ACC←DAC_ACC] ← TRUE;
07800			TDAC[AUTO_ACC-1] ← FALSE;
07900			END "AD";
08000		GO TO L1;
08100	
08200		⊃	ADJUST CLIPS FOR PROPER OUTPUT;
08300	
08400	A:	IF I1>15 THEN BEGIN OUTSTR("I1 TOO LARGE"&CRLF);I1←15;END;
08500		IF I2>15 THEN BEGIN OUTSTR("I2 TOO LARGE"&CRLF);I2←15;END;
08600		IF I1<0 THEN BEGIN OUTSTR("I1 TOO SMALL"&CRLF);I1←0;END;
08700		IF I2<0 THEN BEGIN OUTSTR("I2 TOO SMALL"&CRLF);I2←0;END;
08800		IF CLIPSET(I1, I2) THEN GO TO C;
08900		IF TST(X,Y) THEN
09000	B:		AD ← TRUE ELSE
09100				BEGIN
09200				IF TCLIP≠BCLIP THEN GO TO A;
09300	C:			AD ← FALSE;
09400				END;
09500		IF BS≠BCLIP∨TS≠TCLIP THEN OUTCLIP("ACC") ELSE
09600			OUTSTR("CLIPS RETAINED"&CRLF);
09700		RETURN(AD);
09800		END;
     

00100	⊃	ENTRY TO KEEP RASTER INTERSECTION IN BOUNDS;
00200	
00300	SIMPLE INTERNAL BOOLEAN PROCEDURE ACOMTEST(REFERENCE INTEGER INT, INT2;
00400			INTEGER X,Y,LX,LY);
00500		BEGIN INTEGER A, B, C, TST;
00600		A ← TCLIP;
00700		B ← BCLIP;
00800		C ← DAC_ACC;
00900		X2 ← LX;
01000		Y2 ← LY;
01100		I1 ← INT;
01200		I2 ← INT2;
01300		ACC(TRUE,3,X,Y,TEST1);
01400		INT ← I1;
01500		INT2 ← I2;
01600		IF BCLIP-TCLIP<CLIPDIF THEN
01700			BEGIN
01800			TCLIP ← (TCLIP+BCLIP+CLIPDIF) DIV 2;
01900			BCLIP ← TCLIP+CLIPDIF;
02000			IF BCLIP>7 THEN BEGIN BCLIP←7;TCLIP←7-CLIPDIF;END;
02100			IF TCLIP<0 THEN BEGIN TCLIP←0;BCLIP←CLIPDIF;END;
02200			END;
02300		IF (TST ← A≠TCLIP∨B≠BCLIP∨C≠DAC_ACC) THEN OUTCLIP("ACOMTEST");
02400		RETURN(TST);
02500		END;
02600	
02700	⊃	ENTRY TO ACCOMODATE WHEN AN EDGE IS LOST DURING A RASTER SCAN;
02800	
02900	SIMPLE INTERNAL BOOLEAN PROCEDURE FINEAC(INTEGER X1,Y1,X,Y,INT,INT2);
03000		BEGIN
03100		X2 ← X;
03200		Y2 ← Y;
03300		I1 ← INT;
03400		I2 ← INT2;
03500		RETURN(ACC(FALSE,3,X1,Y1,TEST3));
03600		END;
03700	
03800	⊃	ENTRY TO ACCOMODATE WHEN AN EDGE IS LOST WHILE TRACING;
03900	
04000	SIMPLE INTERNAL BOOLEAN PROCEDURE ACCOMO(INTEGER X,Y;
04100			REFERENCE INTEGER ANGLE,CWX);
04200		BEGIN BOOLEAN T;
04300		TRAC ← TRUE;
04400		X2 ← X;
04500		Y2 ← Y;
04600		CW ← CWX;
04700		I1 ← OB+.5;
04800		I2 ← OD+.5;
04900		T ← ACC(FALSE,5,X,Y,TEST2);
05000		ANGLE ← DIR;
05100		RETURN(T);
05200		END;
     

00100	⊃  VERIFIES  THAT  DETECTED  DISCONTINUITY  BELONGS TO AN OBJECT EDGE OF
00200	   SUFFICIENT EXTENT THAT ATLEAST 14 POINTS IN A 4*4 RECT.  WHOSE  UPPER
00300	   OR  LOWER  LEFT HAND CORNER IS THE FIRST POINT THAT DIFFERED FROM THE
00400	   BACKGROUND ALSO DIFFER FROM THE BACKGROUND BY AT LEAST AS MUCH. XINCR
00500	   IS  SIGNED  INCREMENT  IN  X DIRECTION, SIGFLAG IS TRUE IF OBJECT(2ND
00600	   SAMPLE IN DIRECTION OF SCAN) IS BRIGHTER THAN BACKGROUND;
00700		
00800	DEFINE	RSET(X)="BEGIN IF TST THEN
00900				BEGIN
01000				FLINE←XT;
01100				LLINE←XB;
01200				LSIDE←XL;
01300				RSIDE←XR;
01400				TVIN;
01500				END;
01600			RETURN(X);
01700			END";
01800	
01900	SIMPLE INTERNAL BOOLEAN PROCEDURE XTENT(INTEGER X,Y,XINCR; BOOLEAN SIGFLAG);
02000		BEGIN "XTNT"
02100		INTEGER K,L,COUNT1,COUNT2, STEPX,T,B,LL,R,XT,XB,XL,XR,TST,
02200			SIDER,SIDEL,LINEF,LINEL,ND,INC;
02300		XT←FLINE; XB←LLINE; XL←LSIDE; XR←RSIDE;
02400		TST←FALSE;
02500		STEPX ← IF SIGFLAG THEN 1 ELSE -1;
02600		B←LINEL←(BMAX-1) MIN (Y+4);
02700		T←LINEF←(Y-4) MAX (TMAX+1);
02800		IF XINCR>0 THEN 
02900			BEGIN
03000			INC←1;
03100			LL←SIDEL←(LSMAX+1) MAX (X-XINCR-3);
03200			R←SIDER←(RSMAX-1) MIN (X+3);
03300			END ELSE BEGIN
03400			INC←-1;
03500			R←SIDEL←(RSMAX-1)MIN (X-XINCR+3);
03600			LL←SIDER←(LSMAX+1) MAX (X-3);
03700			END;
03800		COUNT1←COUNT2←INT2←INT←0;
03900		IF B>LLINE∨T<FLINE∨LL<LSIDE∨R>RSIDE THEN
04000			BEGIN
04100			LLINE←B;
04200			FLINE←T;
04300			LSIDE←LL;
04400			RSIDE←R;
04500			TVIN;
04600			TST←TRUE;
04700			INTPNT;
04800			END;
04900		LINEL←LINEL-FLINE;
05000		LINEF←LINEF-FLINE;
05100		SIDEL←SIDEL-LSIDE;
05200		SIDER←SIDER-LSIDE;
05300		ND←SIDEL+INC*3;
05400		FOR K←SIDEL STEP INC UNTIL ND  DO
05500			BEGIN
05600			FOR L←LINEF STEP 1 UNTIL LINEF+3  DO
05700				BEGIN
05800				INT←INT+GETPNT(K,L);
05900				COUNT1 ← COUNT1+1;
06000				END;
06100			FOR L←LINEF+5 STEP 1 UNTIL LINEL DO
06200				BEGIN
06300				INT2←INT2+GETPNT(K,L);
06400				COUNT2 ← COUNT2+1;
06500				END;
06600			END;
06700		INT ← INT/COUNT1+.5;
06800		INT2←INT2/COUNT2+.5;
06900		INT ← IF SIGFLAG THEN INT MIN INT2 ELSE INT MAX INT2;
07000		ND←SIDER-INC*3;
07100		COUNT2 ← COUNT1←0;
07200		FOR K←ND STEP INC UNTIL SIDER DO
07300		   FOR L←LINEF STEP 1 UNTIL LINEF+3 DO
07400			BEGIN "XT2" 
07500			INT2←GETPNT(K,L);
07600			IF ABS(INT2-INT)≥GTHRES THEN COUNT1 ← COUNT1+1;
07700			COUNT2 ← COUNT2+1;
07800			END "XT2";
07900		IF COUNT2-COUNT1<GTHRES THEN RSET(TRUE);
08000		COUNT1 ← COUNT2←0;
08100		FOR K←ND STEP INC UNTIL SIDER DO
08200			FOR L←LINEF+5 STEP 1 UNTIL LINEL DO
08300			BEGIN "XT5" 
08400			INT2←GETPNT(K,L) ;
08500			IF ABS(INT2-INT)≥GTHRES THEN COUNT2 ← COUNT2+1;
08600			COUNT1 ← COUNT1+1;
08700			END "XT5";
08800		RSET(COUNT1-COUNT2<3);
08900		END "XTNT";
     

00100	⊃ 	TEST WHETHER I2 (NEXT SCAN POINT) DIFFERS
00200			IN THE RIGHT WAY FROM I1 TO AN EXTENT SUFFICIENT
00300			TO CONSTITUTE A POSSIBLE EDGE;
00400	
00500	SIMPLE INTERNAL BOOLEAN PROCEDURE DISCON(INTEGER II1,II2,X1,Y1,X2,Y2);
00600		BEGIN "DISCO"
00700		I1←II1;
00800		I2←II2;
00900		IF ADEB∧DISSHW THEN SHOW("DISCON",X1,Y1,X2,Y2);
01000		RETURN(ABS(I2-I1)≥GTHRES);
01100		END "DISCO";
01200	
01300	⊃	CALLED AT START OF RUN;
01400	
01500	SIMPLE INTERNAL INTEGER PROCEDURE SCANINIT;
01600		BEGIN "INIT"
01700		IF TVCAM=1 THEN
01800			BEGIN "ACCOM"
01900			IF DAC_ACC<0 THEN DACO(-DAC_ACC);
02000			SCAN_DIR ← 0;
02100			IF (¬SENSCAL_ACC∨CHANGE_ACC) THEN SENSINIT;
02200			END "ACCOM" ELSE BEGIN
02300			CHANGE_ACC←FALSE;
02400			SENSCAL_ACC←TRUE;
02500			DAC_ACC←AUTO_ACC←30;
02600			END;
02700		TCLIP ← BCLIP ← 5;
02800		CLIPCHG(1);
02900		END "INIT";
03000	END "SCNER";